#include <logbase.h>
#include <inttypes.h>

// 浮点数的存储是由符号位(1位) + 指数位(8位) + 小数位(23位) 组成。
// 符号位：正负。0是正
// 指数位：-128到127，符合char方式，但是需要+127.
// 小数位：二进制的小数位，（1.小数位）格式保存。

// -27.65625f
// 负数：符号位填1.
// 正数部分：11011.
// 负数部分：
// 0.65625-0.5(2^-1) = 0.15625；填1
// 0.15625 - 0.25(2^-2) = 减不了；填0
// 0.15625 - 0.125(2^-3) = 0.03125；填1
// 0.03125 - 0.0625(2^-4) = 减不了;填0
// 0.03125 - 0.03125(2^-5) = 0;填1
// 负数结束。
// -27.65625f 二进制应该表示为：-11011.10101
// 数据二进制需要：1.101110101 左移4位即可。其中正数部分的1负略。
// 101110101保存在小数位
// 指数位填4（小数点左移，用正数．小数点右移，用负数），需要加127.得到10000011
// 最终得到 :
// (1 [100) 0001 (1] 101) 1101 0100 0000 0000 0000
//   1100   0001   1101   1101 0100 0000 0000 0000

void printFloat(float val)
{
    uint8_t *tmpptr = (uint8_t *)&val;
    logdebugc("float=%f,mem=0x%02x%02x%02x%02x", val, tmpptr[3], tmpptr[2], tmpptr[1], tmpptr[0]);
}

int main(int argc, char **argv)
{
    printFloat(-27.65625);
    printFloat(0.875f);
    // printFloat(1000);
    // printFloat(123.456f);
    // printFloat(-54.321f);
    // printFloat(0.783f);

    // {
    //     for (int i = 0; i < 128; i++)
    //     {
    //         int tmpi = 0x7fffffff - i;
    //         logdebugc("%d, %f", tmpi, (float)tmpi);
    //     }
    // }
    //　float小数分辨率是1/2^23=0.00000011920928955078125.因此6位小数以内能精准表示．
    {
        float tmppi = 3.14159265f;
        logdebugc("pi(3.14159265f)=%f,%.8f", tmppi, tmppi);
    }
    {
        // [2025-03-10 17:38:20.447]dbg[cvaluetype.c,45] 2147483584, 2147483648.000000
        // [2025-03-10 17:38:20.447]dbg[cvaluetype.c,45] 2147483583, 2147483520.000000
        //　数字超过2^23后，存在误差，他虽然能表示大于2^32，但是误差也很大．大约表示范围：AI一下．3.402823e+38
        //　float表示2^31此方时整数分辨率是128．也就是2^7
        logdebugc("%d, %f", 2147483584, (float)2147483584);
        logdebugc("%d, %f", 2147483583, (float)2147483583);
    }
    {
        float tmpf = 3.402823e+38;
        logdebugc("val=%f", tmpf);
        logdebugc("0x%08x", *(uint32_t *)&tmpf);
    }
    return 1;
}
